//
//  Status.swift
//  weiboxiangmu
//
//  Created by wei_jingyun on 15/6/30.
//  Copyright © 2015年 wei_jingyun. All rights reserved.
//

import UIKit
import AFNetworking
import SDWebImage

class Status: NSObject  {
    // MARK : - 数据模型属性
    // 行高
    var rowHeight = -1 as CGFloat
    
    // 微博创建时间
    var created_at : String?
    // 发送微博的ID
    var id : Int = 0
    // 微博内容
    var text : String?
    // 微博来源
    var source : String?{
        /// <a href="http://app.weibo.com/t/feed/3auC5p" rel="nofollow">皮皮时光机</a>, created_at: Thu Jul 09 11:09:32 +0800 2015
        didSet{
            let arr = source?.regular("a href=\"(.*?)\".*?>(.*?)</a>")
            if arr?.count == 2 {
                source =  arr![1]
            }else {
                source = nil
            }
        }
    }
    // 配图
    var pic_urls : [[String : String]]?{
        didSet{
            // 创建设置imageURLs 数组
            imageURLs = [NSURL]()
            // 生成并且添加 url
            for dict in pic_urls! {
                let urlString = dict["thumbnail_pic"]!
                
                imageURLs?.append(NSURL(string: urlString)!)
            }
        }
    }
    
    // 配图数组改为私有，外部 哪里出错该哪里
     private  var imageURLs: [NSURL]?
    /// 计算型属性，配图的 URL 数组
    /// 如果是转发微博，只需要缓存转发微博的 imageURLs，原创的 imageURLs 是 nil
    /// 如果是原创微博，imageURLs 可能有内容
    var picURLs: [NSURL]? {
        return retweeted_status != nil ? retweeted_status?.imageURLs : imageURLs
    }
    
    // 用户模型
    var user : User?
    /// 被转发的原微博信息字段，当该微博为转发微博时返回
    var retweeted_status: Status?
    
    // 类属性数组
    static let properties = ["created_at", "id", "text", "source", "pic_urls"]
    
    // 字典转模型
     init(dict : [String : AnyObject]) {
        super.init()
        for key in Status.properties {
            
            if dict[key] == nil {
                continue
            }
            setValue(dict[key], forKey: key)
        }
        
        // 缓存用户模型
        if let userDict = dict["user"] as? [String: AnyObject]{
            user = User(dict: userDict)
        }
        
        // 缓存 转发微博， 转发微博字段与 原创一至
        if let retweetedDict = dict["retweeted_status"] as? [String: AnyObject] {
            retweeted_status = Status(dict: retweetedDict)
        }
    }
    

    override var description: String {
        let dict = dictionaryWithValuesForKeys(Status.properties)
        
        return "\(dict)\n    "
    }
    
    // 将数组转为模型数组
    private class func statuses (array : [[String : AnyObject]]) -> [Status]{
        var arrayM = [Status]()
        
        // 遍历数组转换模型
        for dic :[String : AnyObject] in array {
            arrayM.append(Status(dict: dic))
        }
        
        return arrayM
    }
    
    // MARK: - 从网络加载数据
    /*
        since_id    若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0
        max_id      若指定此参数，则返回ID小于或等于max_id的微博，默认为0
    */
    class func loadStatus(since_id: Int, max_id: Int, finished : (statuses :[Status]? , error: NSError?) ->()  ){
        var params = ["access_token" : sharedUserAccount!.access_token ,
            "count" : NSNumber(integer: 20) , "page" : NSNumber(integer: 1)] // 必须存在
        
        // 可避免都为 0 都为 0 就是默认
        if since_id > 0 {
            params["since_id"] = "\(since_id)"
        }
        
        if max_id > 0 {
            params["since_id"] = "0"
            params["max_id"] = "\(max_id - 1)"
        }
        
        // 网络请求
        NetWorkTools.sharedNetWorkTools().GET("2/statuses/home_timeline.json", parameters: params, success: { (_, JSON) -> Void in
                let array = JSON["statuses"] as! [[String : AnyObject]]
                
                // 微博数组
                let  statusLists = statuses(array)
                cacheWebImages(statusLists, finished: finished)
            
            }) { (_, error) -> Void in
                finished(statuses: nil, error: error)
                Debug.Log(error)
        }
        
    }
    
    // MARK: 缓存用户图标 和 微博图片  需要图片来确定cell
    private class func cacheWebImages(list: [Status], finished: (statuses: [Status]?, error: NSError?) -> ()) {
        // 创建调度组
        let group = dispatch_group_create()
        
        // 遍历数组添加到调度组
        for s in list {
            
            // 缓存用户图片
            dispatch_group_enter(group)
            s.user?.downLoadNameImage({ () -> () in
                dispatch_group_leave(group)
            })
            
            
            // 缓存微博图片
            if s.picURLs == nil || s.picURLs!.isEmpty {
                continue
            }
            
            for url in s.picURLs!{
                // 进入组
                 dispatch_group_enter(group)
                // 用 sdwebimage 缓存图片 downloadImageWithURL 是 SDWebImage 核心的图像下载函数
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (_, _ , _ , _ , _ ) -> Void in
                    // 离开组
                   dispatch_group_leave(group)
                })
            }

        }
        
        // 监听调度组 调度组完成后执行
        dispatch_group_notify(group, dispatch_get_main_queue()) {
            // 完成回调
            finished(statuses: list, error: nil)
        }
    }
    
}
